#include <stdio.h>
#include <unistd.h>  // 用于sleep()函数，控制状态切换间隔

// 定义交通灯状态枚举（红→绿→黄循环）
/**
 * @brief 交通灯状态枚举类型
 * RED - 红灯
 * GREEN - 绿灯
 * YELLOW - 黄灯
 */
typedef enum {
    RED,        // 红灯
    GREEN,      // 绿灯
    YELLOW      // 黄灯
} LightState;

/**
 * @brief 输出当前交通灯状态及提示信息
 * @param state 当前交通灯状态
 */
void printLightState(LightState state) {
    switch (state) {
        case RED:
            printf("=== 红灯亮 ===\n");
            printf("禁止通行，请等待...\n");
            break;
        case GREEN:
            printf("=== 绿灯亮 ===\n");
            printf("可以通行，注意安全...\n");
            break;
        case YELLOW:
            printf("=== 黄灯亮 ===\n");
            printf("即将变灯，请准备停车...\n");
            break;
        default:
            printf("未知状态\n");
    }
    printf("-------------------------\n");  // 分隔符，增强可读性
}

/**
 * @brief 获取下一个交通灯状态（红→绿→黄→红循环）
 * @param current 当前状态
 * @return 下一个状态
 */
LightState getNextState(LightState current) {
    switch (current) {
        case RED:
            return GREEN;  // 红灯之后是绿灯
        case GREEN:
            return YELLOW; // 绿灯之后是黄灯
        case YELLOW:
            return RED;    // 黄灯之后是红灯
        default:
            return RED;    // 异常状态默认返回红灯
    }
}
/**
 * @brief 交通灯模拟器主函数
 * @param currentState 初始状态
 * @param cycleCount 循环次数
 * @param totalSteps 总步骤数
 */
void demo(LightState currentState,int cycleCount,int totalSteps){
    printf("===== 交通灯模拟器启动 =====\n");
    printf("将循环%d次完整切换（红→绿→黄）\n", cycleCount);
    printf("-------------------------\n");
// 循环切换并显示交通灯状态
    for (int i = 0; i < totalSteps; i++) {
        printLightState(currentState);  // 显示当前状态
        
        // 根据当前状态设置不同的等待时间（模拟实际交通灯时长）
        switch (currentState) {
            case RED:
                sleep(5);  // 红灯亮5秒
                break;
            case GREEN:
                sleep(5);  // 绿灯亮5秒
                break;
            case YELLOW:
                sleep(2);  // 黄灯亮2秒（通常较短）
                break;
        }
        
        currentState = getNextState(currentState);  // 切换到下一个状态
    }
    printf("===== 交通灯模拟器结束 =====\n");
}
/**
 * @brief 主函数，程序入口
 * @return 退出状态
 */
int main() {
    LightState currentState = RED;  // 初始状态设为红灯
    int cycleCount = 3;             // 循环3次完整的红绿灯切换（可调整）
    int totalSteps = cycleCount * 3; // 每次循环包含3个状态（红→绿→黄）
    demo(currentState,cycleCount,totalSteps);// 启动模拟
    return 0;
}